package com.nebula.salary.portal.service;

import com.nebula.salary.common.result.ServerResponse;
import com.nebula.salary.model.dto.ForgotDto;
import com.nebula.salary.model.dto.LoginDto;
import com.nebula.salary.model.dto.RegisterDto;
import com.nebula.salary.model.dto.UserQueryDto;
import com.nebula.salary.model.pojo.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nebula.salary.model.vo.LoginUser;
import com.nebula.salary.model.vo.PageResult;
import com.nebula.salary.model.vo.UserVo;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author codex
 * @since 2022-01-24
 */
public interface IUserService extends IService<User> {
    
    /**
     * 用户登录
     *
     * @param loginDto 用户登录DTO
     * @return token
     */
    String login(LoginDto loginDto);
    
    /**
     * 用户注册
     *
     * @param registerDto 用户注册DTO
     * @return 注册结果
     */
    ServerResponse<String> register(RegisterDto registerDto);
    
    /**
     * 退出登录
     *
     * @param request request
     */
    void logout(HttpServletRequest request);
    
    /**
     * 根据用户名查询用户信息，包括角色信息
     *
     * @param username 用户名
     * @return 用户信息，包括角色信息
     */
    User selectUserByUsername(String username);
    
    /**
     * 获取有权管理的用户列表
     *
     * @param dto 用户管理查询数据传输类
     * @return 用户列表
     */
    PageResult getUserList(UserQueryDto dto);
    
    /**
     * 校验数据
     *
     * @param user 用户信息
     */
    void checkData(User user);
    
    /**
     * 校验用户名是否唯一
     *
     * @param username 用户名
     * @return 结果
     */
    String checkUsernameUnique(String username);
    
    /**
     * 校验手机号码是否唯一
     *
     * @param user 用户信息
     * @return 结果
     */
    String checkPhoneUnique(User user);
    
    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    UserVo getInfoByUserId(Long userId);
    
    /**
     * 验证是否有权限操作该用户
     *
     * @param userId 用户ID
     */
    void checkUserDataScope(Long userId);
    
    /**
     * 批量删除
     *
     * @param userIds 用户ID
     * @return 影响行数
     */
    int deleteUserByIds(Long[] userIds);

    /**
     * 找回密码
     * 
     * @param forgotDto 找回密码数据传输类
     * @return 影响行数
     */
	int forgot(ForgotDto forgotDto);
}
